package beans.number;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

/**
 * 功能数字归类器2.0 两个版本的类尽管差别细微但是很重要。最主要的区别是2.0版本缺少了状态共享。<br>
 * 消除状态共享在函数式编程中是比较受欢迎的一种抽象手法。<br>
 * 作为跨方法共享状态的替代方案，我采用直接调用的方式来消除状态共享。<br>
 * 从设计的角度来说，它让factors()方法变的更长，但是它也防止了factors字段暴漏到方法之外。<br>
 * 注意，2.0是完全由静态方法组成的。在方法间不存在知识共享的问题，因此我可以在更少函数范围上做封装。<br>
 * 一旦你给它们输入参数和期待值，这些方法都会工作的很好（这个是一个纯函数例子，这个概念我在将来会进一步探索它）。
 * 
 * @author beanstao@gmail.com
 * 
 */
public class ClassifierOfNumber
{
	static public boolean isFactor(int number, int potential_factor)
	{
		return number % potential_factor == 0;
	}

	static public Set<Integer> factors(int number)
	{
		HashSet<Integer> factors = new HashSet<Integer>();
		for (int i = 1; i <= Math.sqrt(number); i++)
			if (isFactor(number, i))
			{
				factors.add(i);
				factors.add(number / i);
			}
		return factors;
	}

	static public int sum(Set<Integer> factors)
	{
		Iterator<Integer> it = factors.iterator();
		int sum = 0;
		while (it.hasNext())
			sum += it.next();
		return sum;
	}

	static public boolean isPerfect(int number)
	{
		return sum(factors(number)) - number == number;
	}

	static public boolean isAbundant(int number)
	{
		return sum(factors(number)) - number > number;
	}

	static public boolean isDeficient(int number)
	{
		return sum(factors(number)) - number < number;
	}

	public static void main(String[] args)
	{
	}

}
